In [27]:
pkg_ver = lambda pkg: "{:<20}{:}".format(pkg.__name__,pkg.__version__)

# ROOT
import uproot
print(pkg_ver(uproot))
import ROOT

# Machine Learning
import sklearn
print(pkg_ver(sklearn))
import torch
print(pkg_ver(torch))

# Data science
import scipy
print(pkg_ver(scipy))
import numpy
print(pkg_ver(numpy))
import pandas
print(pkg_ver(pandas))

# Visualizations
import matplotlib
print(pkg_ver(matplotlib))
import matplotlib.pyplot as plt
import hvplot
print(pkg_ver(hvplot))
import hvplot.pandas
pandas.options.plotting.backend = 'holoviews'

import tqdm
print(pkg_ver(tqdm))
from tqdm.auto import tqdm
tqdm.pandas()

import glob
uproot              5.0.7
sklearn             1.2.2
torch               2.0.0
scipy               1.10.1
numpy               1.23.5
pandas              1.5.3
matplotlib          3.7.1
hvplot              None
tqdm                4.62.3
In [2]:
%jsroot
In [3]:
class spectrum:
    
    def __init__(self, File_, iTED_, Crystal_, Configuration_, Window_, Calibration_, Run_):  

        self.__File = ROOT.TFile.Open(File_,"READ")
        self.__iTED = iTED_
        self.__Crystal = Crystal_
        self.__Configuration = Configuration_
        self.__Window = Window_
        self.__Calibration = Calibration_
        self.__Run = Run_
        
    def __call__(self, ch):
        return numpy.polyval(self.__Calibration[::-1],ch)
    
    def __ch__(self, en):
        p = numpy.poly1d(self.__Calibration[::-1])
        temp  = set(i for i in (p - en).roots if i > 0)
        return list(temp).pop()

    def File(self):
        return self.__File
    
    def TH1D(self):
        self.__TH1D = self.__File.Get(
                            "{}_{}_amplitude_spectra;1".format(
                                "SCATTERER" if self.__Crystal==0 else "ABSORBER",
                                self.__iTED if self.__Crystal==0 else "{}_{}".format(self.__iTED,self.__Crystal)
                            )
                        )
        
        return self.__TH1D
    
    def Calibration(self):
        return self.__Calibration
    
    def iTED(self):
        return self.__iTED
    
    def Crystal(self):
        return self.__Crystal
    
    def Configuration(self):
        return self.__Configuration
    
    def Window(self):
        return self.__Window
    
    def Rate(self, Time_):
        return self.__TH1D.Integral()/Time_
    
    def Alpha(self, Time_):
        return self.__TH1D.Integral(
            self.__TH1D.FindBin(self.__ch__(1600)),
            self.__TH1D.FindBin(self.__ch__(2800))
        )/Time_
    
    def __repr__(self):
        return "iTED: {},Crystal: {},Configuration: {},Window: {}, Run: {}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window,
            self.__Run
        )
    
    def __str__(self):
        return "{}.{}.{}.{}.{}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window,
            self.__Run
        )
In [4]:
calp = glob.glob('/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/Calibration/**/*.CALp', recursive=True)

calibrations = []

for i in calp:
    line = pandas.read_csv(
        i,
        sep = "      :  ",
        skiprows=[0,4,5,6],
        header=None,
        engine="python"
    ).drop([0], axis=1).T
    
    line["crystal"] = i.split("/")[-1][:2]
    line["cw"] = i.split("/")[-1][5:8]
    
    calibrations.append(line)
    
calibrations_df = pandas.concat(calibrations)
In [5]:
def get_resolution(cell):
    
    TH1D = cell.TH1D()
    
    TH1D.GetXaxis().SetRange(TH1D.FindBin(100),TH1D.FindBin(400))
    
    MaxBin   = TH1D.FindBin(TH1D.GetMaximumBin())
    
    ADC_Low  = MaxBin-50
    ADC_High = MaxBin+40

    gaussFit = ROOT.TF1("gaussFit", "pol2(0)+gaus(3)", ADC_Low, ADC_High)
    gaussFit.SetParameters(1000,-1,0,TH1D.GetMaximum(),MaxBin,10)
    TH1D.Fit(gaussFit,"QR")
    
    sigma = abs(gaussFit.GetParameter(5))
    centroid_ch = gaussFit.GetParameter(4)
    
    x1 = cell(centroid_ch+sigma*numpy.sqrt(2*numpy.log(2)))
    x2 = cell(centroid_ch-sigma*numpy.sqrt(2*numpy.log(2)))
    centroid = cell(centroid_ch)
        
    fwhm = x1-x2
            
    return sigma*numpy.sqrt(2*numpy.log(2))*2/centroid_ch*100, (fwhm/centroid)*100, centroid
In [6]:
def TH1D_draw(cell):
    
    TH1D = cell.TH1D()
    
    canvas = ROOT.TCanvas()
    canvas.cd()
    
    TH1D.SetTitle(repr(cell))
    TH1D.SetStats(False)
    
    latex = ROOT.TLatex()
    latex.SetNDC()
    latex.SetTextSize(0.03)
    
    TH1D.Draw("pe")
    
    l1,l2,l3 = get_resolution(cell)
    
    l4 = uproot.open(f"../../data/nTOF_March2022/888/CW100ns/Resolutions_Cs137_CenterScatter_iTED{cell.iTED()}_8.8.8_100ns.root:grResolEnergy;1").values()[1][cell.Crystal()]
    
    latex.DrawText(0.7, 0.8, "R_ch: {:.2f}%".format(l1))
    
    if l4*0.9 < l2 < l4*1.1:
        latex.DrawText(0.7, 0.75, "R_E: {:.2f}%".format(l2))
    else:
        latex.DrawText(0.7, 0.75, "->R_E: {:.2f}%".format(l2))
        
    if 662*(1-l2/100) < l3 < 662*(1+l2/100):
        latex.DrawText(0.7, 0.7, "E: {:.0f}keV".format(l3))
    else:
        latex.DrawText(0.7, 0.7, "->E: {:.0f}keV".format(l3))
        
    latex.DrawText(0.7, 0.65, "R_E(old): {:.2f}%".format(l4))
    latex.DrawText(0.7, 0.6, "Change: {:.2f}%".format(l2-l4))
            
    return canvas
In [7]:
Data = {
    1:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_53_56_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie1_40_CW{win}.root",
    2:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_54_14_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie2_40_CW{win}.root",
    3:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_54_33_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie3_40_CW{win}.root",
    4:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_54_51_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie4_40_CW{win}.root",
    5:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_55_10_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie5_40_CW{win}.root",
    6:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_55_29_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie6_40_CW{win}.root",
    7:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_55_47_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie7_40_CW{win}.root",
    8:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_56_06_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie8_40_CW{win}.root",
    9:  lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_56_24_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie9_40_CW{win}.root",
    10: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_56_43_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie10_40_CW{win}.root",
    11: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_57_02_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie11_40_CW{win}.root",
    12: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_57_20_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie12_40_CW{win}.root",
    13: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_57_39_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie13_40_CW{win}.root",
    14: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_57_57_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie14_40_CW{win}.root",
    15: lambda win: f"/run/media/bgameiro/d043b5e4-57a4-457e-8839-cb1adc9c72bc/Data/data_2023_05_22/Temperature_Cs137_center_D.2023_05_22_T.15_58_16_C.itedABCD_lab_custom_2023.02.22_4.0v_887_15s_serie15_40_CW{win}.root",
}
In [33]:
entries = []

for i_run in tqdm(Data):
    for ASIC in tqdm([0]):
        for CW in [100,200]:
            
            file_data = Data[i_run](CW)

            spectr = spectrum(
                file_data,
                "A", 
                0, 
                "88c", 
                CW, 
                calibrations_df.query("crystal == 'A0' & cw == '100'").iloc[0][[0,1,2]],
                i_run
            )
            
            entries.append(
                pandas.DataFrame({
                    "resolution": get_resolution(spectr)[1],
                    "fit": (get_resolution(spectr)[2]-662)/662*100,
                    "peak": get_resolution(spectr)[2],
                    "cps": spectr.Rate(30),
                    "alpha": spectr.Alpha(30),
                    "iTED": "A",
                    "crystal": 0,
                    "cw": CW,
                    "configuration": "88c",
                    "run": i_run,
                    "obj": spectr,
                    "temperature": uproot.open(file_data)['T_ASIC_0;1'].values()[1].mean()
                }, index=[0])
            )
                    
entries_df = pandas.concat(entries, ignore_index=True)
  0%|          | 0/15 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
  0%|          | 0/1 [00:00<?, ?it/s]
In [34]:
entries_df
Out[34]:
resolution fit peak cps alpha iTED crystal cw configuration run obj temperature
0 6.615661 5.364127 697.510518 598.633333 11.400000 A 0 100 88c 1 A.0.88c.100.1 29.200000
1 6.259460 5.675688 699.573053 601.566667 11.433333 A 0 200 88c 1 A.0.88c.200.1 29.200000
2 6.426005 3.509538 685.233145 588.400000 13.266667 A 0 100 88c 2 A.0.88c.100.2 29.542857
3 6.051092 3.865828 687.591784 590.066667 13.333333 A 0 200 88c 2 A.0.88c.200.2 29.542857
4 6.440137 2.751300 680.213604 579.500000 10.166667 A 0 100 88c 3 A.0.88c.100.3 29.823077
5 6.158773 3.064168 682.284793 581.866667 10.200000 A 0 200 88c 3 A.0.88c.200.3 29.823077
6 6.503773 1.589532 672.522701 581.200000 12.466667 A 0 100 88c 4 A.0.88c.100.4 30.000000
7 6.284833 1.855155 674.281129 584.233333 12.500000 A 0 200 88c 4 A.0.88c.200.4 30.000000
8 6.406230 0.627043 666.151027 572.866667 12.366667 A 0 100 88c 5 A.0.88c.100.5 30.228571
9 6.212240 0.920471 668.093519 574.233333 12.533333 A 0 200 88c 5 A.0.88c.200.5 30.228571
10 6.488312 -0.529078 658.497504 570.500000 12.333333 A 0 100 88c 6 A.0.88c.100.6 30.435714
11 6.315197 -0.291239 660.072000 572.900000 12.433333 A 0 200 88c 6 A.0.88c.200.6 30.435714
12 6.438912 -1.171249 654.246333 564.233333 12.733333 A 0 100 88c 7 A.0.88c.100.7 30.564286
13 6.142366 -0.915529 655.939195 567.700000 12.766667 A 0 200 88c 7 A.0.88c.200.7 30.564286
14 6.429407 -1.042616 655.097884 563.800000 12.300000 A 0 100 88c 8 A.0.88c.100.8 30.746154
15 6.259785 -0.792691 656.752383 566.566667 12.400000 A 0 200 88c 8 A.0.88c.200.8 30.746154
16 6.423355 -2.088959 648.171090 555.200000 11.333333 A 0 100 88c 9 A.0.88c.100.9 30.807143
17 6.159459 -1.790502 650.146873 559.333333 11.600000 A 0 200 88c 9 A.0.88c.200.9 30.807143
18 6.701600 -3.161442 641.071252 554.900000 13.300000 A 0 100 88c 10 A.0.88c.100.10 30.900000
19 6.424872 -2.884297 642.905953 558.533333 13.266667 A 0 200 88c 10 A.0.88c.200.10 30.900000
20 6.544011 -3.506867 638.784544 554.200000 12.633333 A 0 100 88c 11 A.0.88c.100.11 31.100000
21 6.317894 -3.251903 640.472401 556.400000 12.633333 A 0 200 88c 11 A.0.88c.200.11 31.100000
22 6.401276 -4.355122 633.169089 532.333333 12.333333 A 0 100 88c 12 A.0.88c.100.12 31.100000
23 6.172739 -4.092941 634.904732 534.400000 12.600000 A 0 200 88c 12 A.0.88c.200.12 31.100000
24 6.488503 -4.947359 629.248482 545.766667 11.633333 A 0 100 88c 13 A.0.88c.100.13 31.300000
25 6.243210 -4.709348 630.824114 547.933333 11.766667 A 0 200 88c 13 A.0.88c.200.13 31.300000
26 6.537247 -4.802907 630.204755 550.633333 11.533333 A 0 100 88c 14 A.0.88c.100.14 31.335714
27 6.233759 -4.560096 631.812168 553.666667 11.866667 A 0 200 88c 14 A.0.88c.200.14 31.335714
28 6.547150 -5.163845 627.815344 545.366667 13.333333 A 0 100 88c 15 A.0.88c.100.15 31.392308
29 6.334186 -4.918200 629.441517 549.166667 13.266667 A 0 200 88c 15 A.0.88c.200.15 31.392308
In [38]:
entries_df.hvplot.scatter(y='peak', x='temperature', by="cw")
Out[38]:
In [39]:
entries_df.hvplot.scatter(y='fit', x='temperature', by="cw")
Out[39]:
In [43]:
entries_df.hvplot.scatter(y='resolution', x='temperature', by="cw")
Out[43]:
In [ ]: